/*
 * 文 件 名:  BaseException.java
 * 版    权:  XXXXXX Technologies Co., Ltd. Copyright 2012-2022,  All rights reserved
 * 描    述:  BaseException 异常处理类的基类
 * 修 改 人:  Leo
 * 修改时间:  2012-10-31
 * 跟踪单号:  <跟踪单号>
 * 修改单号:  <修改单号>
 * 修改内容:  <修改内容>
 */
package org.uam.exception;

import java.io.PrintStream;
import java.io.PrintWriter;

/**
 * BaseException 异常处理类的基类
 * 这是处理在运行时发生的错误异常总基类。定义
 * 
 * @author  Leo
 * @version  [1.0, 2012-10-31]
 * @see  [相关类/方法]
 * @since  [产品/模块版本]
 */
public abstract class BaseException extends RuntimeException
{
    /**
     * serialVersionUID
     */
    private static final long serialVersionUID = -1706881948822897736L;
    
    private Throwable cause;
    
    /**
     * 异常处理类基类带参数的构造函数
     * @param message 消息
     * @param cause 异常信息
     * @see [类、类#方法、类#成员]
     */
    protected BaseException(String message, Throwable cause)
    {
        super(message);
        this.cause = cause;
    }
    
    /**
     * 异常处理类基类带参数的构造函数
     * @param cause 异常信息
     * @see [类、类#方法、类#成员]
     */
    protected BaseException(Throwable cause)
    {
        this("", cause);
    }
    
    /**
     * 异常处理类基类带参数的构造函数
     * @param message 消息
     * @see [类、类#方法、类#成员]
     */
    protected BaseException(String message)
    {
        this(message, null);
    }
    
    /**
     * <默认构造函数>
     */
    protected BaseException()
    {
        this("", null);
    }
    
    public Throwable getCause()
    {
        return cause == null ? this : cause;
    }
    
    //  @Override
    //  public String getMessage()
    //  {
    //      String msg = super.getMessage();
    //      Throwable cause = getCause();
    //      if (cause != null)
    //      {
    //          msg = msg + "; nested exception is \n" + cause;
    //      }
    //      
    //      return msg;
    //  }
    
    /**
     * 打印默认错误信息
     */
    @Override
    public void printStackTrace()
    {
        printStackTrace(System.err);
    }
    
    /**
     * {@inheritDoc}
     */
    @Override
    public void printStackTrace(PrintStream ps)
    {
        Throwable cau = getCause();
        if (cau == null)
        {
            super.printStackTrace(ps);
        }
        else
        {
            ps.println(this);
            cau.printStackTrace(ps);
        }
        
    }
    
    /**
     * {@inheritDoc}
     */
    @Override
    public void printStackTrace(PrintWriter pw)
    {
        Throwable cau = getCause();
        if (cau == null)
        {
            super.printStackTrace(pw);
        }
        else
        {
            pw.print(this);
            cau.printStackTrace(pw);
        }
    }
}
